﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class WorkflowConfigParametro
    {
        #region Variaveis Membro
        private int _idWfParametro;
        private WorkflowConfigData _wfConfigData;
        private WorkflowNivel _wfNivel;
        private int _parametroDia;
        private WorkflowConfig _wfConfig;
        private List<GrupoEmail> _grupoEmail;
        private TipoAtestado _tipoAtestado;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdWfConfigParametro
        {
            get { return _idWfParametro; }
            set { _idWfParametro = value; }
        }
        public WorkflowConfigData WfConfigData
        {
            get { return _wfConfigData; }
            set { _wfConfigData = value; }
        }
        public WorkflowNivel WfNivel
        {
            get { return _wfNivel; }
            set { _wfNivel = value; }
        }
        public int ParametroDia
        {
            get { return _parametroDia; }
            set { _parametroDia = value; }
        }
        public WorkflowConfig WfConfig
        {
            get { return _wfConfig; }
            set { _wfConfig = value; }
        }
        public List<GrupoEmail> GrupoEmail
        {
            get { return _grupoEmail; }
            set { _grupoEmail = value; }
        }
        public TipoAtestado TipoAtestado
        {
            get { return _tipoAtestado; }
            set { _tipoAtestado = value; }
        }
        #endregion

        #region Construtores
        public WorkflowConfigParametro()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public WorkflowConfigParametro(int idWfParametro)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idWfParametro, false);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public WorkflowConfigParametro(int idWfParametro, bool isCarregaGrupoEmail)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idWfParametro, isCarregaGrupoEmail);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idWfParametro, bool isCarregaGrupoEmail)
        {
            try
            {
                var consulta = from cwp in _context.tab_configuracao_parametro_workflow
                               where cwp.id_parametro_workflow == idWfParametro
                               select new
                               {
                                   cwp.id_parametro_workflow,
                                   id_dt_configuracao_workflow = cwp.tab_configuracao_data_workflow == null ? 0 : cwp.tab_configuracao_data_workflow.id_dt_configuracao_workflow,
                                   cwp.tab_nivel_workflow.id_nivel_workflow,
                                   cwp.parametro_dia,
                                   id_configuracao_workflow = cwp.tab_configuracao_workflow == null ? 0 : cwp.tab_configuracao_workflow.id_configuracao_workflow,
                                   id_tipo_atestado = cwp.tab_tipo_atestado == null ? 0 : cwp.tab_tipo_atestado.id_tipo_atestado
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idWfParametro = list.id_parametro_workflow;
                    this._wfConfigData = new WorkflowConfigData(list.id_dt_configuracao_workflow);
                    this._wfNivel = new WorkflowNivel(list.id_nivel_workflow);

                    //10	Alerta1
                    //11	Alerta2
                    //14	Alerta3
                    //15	Alerta4

                    if (list.id_nivel_workflow == 10 || list.id_nivel_workflow == 11 || list.id_nivel_workflow == 14 || list.id_nivel_workflow == 15)
                        this._parametroDia = list.parametro_dia;
                    else
                        this._parametroDia = list.parametro_dia * -1;

                    this._wfConfig = new WorkflowConfig(list.id_configuracao_workflow);
                    this._tipoAtestado = new TipoAtestado(list.id_tipo_atestado);

                    if (isCarregaGrupoEmail)
                        CarregaGrupoEmail();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void CarregaGrupoEmail()
        {
            try
            {
                GrupoEmail grupoEmail = new GrupoEmail();
                this._grupoEmail = grupoEmail.SelectPorWfParametro(this._idWfParametro);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void CarregaId()
        {
            try
            {
                List<WorkflowConfigParametro> listWfParametro = new List<WorkflowConfigParametro>();

                if (this.WfConfig != null)
                {
                    var consulta = from cwp in _context.tab_configuracao_parametro_workflow
                                   where cwp.tab_configuracao_workflow.id_configuracao_workflow == this.WfConfig.IdWfConfig
                                   && cwp.tab_nivel_workflow.id_nivel_workflow == this.WfNivel.IdWfNivel
                                   && cwp.parametro_dia == this.ParametroDia
                                   orderby cwp.id_parametro_workflow descending
                                   select cwp;

                    var listConsulta = consulta.ToList();

                    foreach (var list in listConsulta)
                    {
                        this.IdWfConfigParametro = list.id_parametro_workflow;
                        break;
                    }
                }
                else
                {
                    var consulta = from cwp in _context.tab_configuracao_parametro_workflow
                                   where cwp.tab_configuracao_data_workflow.id_dt_configuracao_workflow == this.WfConfigData.IdWfConfigData
                                   && cwp.tab_nivel_workflow.id_nivel_workflow == this.WfNivel.IdWfNivel
                                   && cwp.parametro_dia == this.ParametroDia
                                   orderby cwp.id_parametro_workflow descending
                                   select cwp;

                    var listConsulta = consulta.ToList();

                    foreach (var list in listConsulta)
                    {
                        this.IdWfConfigParametro = list.id_parametro_workflow;
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private int RetornaIdRelacaoGrupoEmail(int idWfConfigParametro, int idGrupoEmail)
        {
            try
            {
                int idRelacao = 0;

                var consulta = from rel in _context.tab_configuracao_parametro_workflow_grupo_email
                               where rel.tab_configuracao_parametro_workflow.id_parametro_workflow == idWfConfigParametro
                               && rel.tab_grupo_email.Id_grupo_email == idGrupoEmail
                               select rel;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    idRelacao = list.id_configuracao_parametro_grupo_email;
                }

                return idRelacao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #region Métodos de Persistência
        public void SalvarAtestadosConfigParametro()
        {
            try
            {
                if (this._tipoAtestado.IdTipoAtestado == 0)
                {
                    TipoAtestado tipoAtestado = new TipoAtestado();
                    List<TipoAtestado> listTipoAtestado = tipoAtestado.SelectAtestadoWfConfigParam(this.WfConfig.IdWfConfig);

                    foreach (TipoAtestado tp in listTipoAtestado)
                    {
                        tab_configuracao_parametro_workflow tabParametro = new tab_configuracao_parametro_workflow();

                        if (WfConfigData != null)
                            tabParametro.tab_configuracao_data_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_data_workflow", "id_dt_configuracao_workflow", this.WfConfigData.IdWfConfigData);
                        if (WfConfig != null)
                            tabParametro.tab_configuracao_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_workflow", "id_configuracao_workflow", this.WfConfig.IdWfConfig);

                        tabParametro.tab_nivel_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_nivel_workflow", "id_nivel_workflow", this.WfNivel.IdWfNivel);
                        tabParametro.tab_tipo_atestadoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_atestado", "id_tipo_atestado", tp.IdTipoAtestado);
                        tabParametro.parametro_dia = this.ParametroDia;

                        _context.AddTotab_configuracao_parametro_workflow(tabParametro);
                        _context.SaveChanges();

                        CarregaId();

                        SalvarGrupoEmail();
                    }
                }
                else
                {
                    tab_configuracao_parametro_workflow tabParametro = new tab_configuracao_parametro_workflow();

                    if (WfConfigData != null)
                        tabParametro.tab_configuracao_data_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_data_workflow", "id_dt_configuracao_workflow", this.WfConfigData.IdWfConfigData);
                    if (WfConfig != null)
                        tabParametro.tab_configuracao_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_workflow", "id_configuracao_workflow", this.WfConfig.IdWfConfig);

                    tabParametro.tab_nivel_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_nivel_workflow", "id_nivel_workflow", this.WfNivel.IdWfNivel);
                    tabParametro.tab_tipo_atestadoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_atestado", "id_tipo_atestado", this._tipoAtestado.IdTipoAtestado);
                    tabParametro.parametro_dia = this.ParametroDia;

                    _context.AddTotab_configuracao_parametro_workflow(tabParametro);
                    _context.SaveChanges();

                    CarregaId();

                    SalvarGrupoEmail();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion

        #region Metodo Publicos

        #region Metodos de Selecao
        public List<WorkflowConfigParametro> SelectAll()
        {
            try
            {
                List<WorkflowConfigParametro> listWfParametro = new List<WorkflowConfigParametro>();

                var consulta = from cwp in _context.tab_configuracao_parametro_workflow
                               select new
                               {
                                   cwp.id_parametro_workflow,
                                   id_dt_configuracao_workflow = cwp.tab_configuracao_data_workflow == null ? 0 : cwp.tab_configuracao_data_workflow.id_dt_configuracao_workflow,
                                   cwp.tab_nivel_workflow.id_nivel_workflow,
                                   cwp.parametro_dia,
                                   id_configuracao_workflow = cwp.tab_configuracao_workflow == null ? 0 : cwp.tab_configuracao_workflow.id_configuracao_workflow
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfigParametro wfParametro = new WorkflowConfigParametro();
                    wfParametro.IdWfConfigParametro = list.id_parametro_workflow;
                    wfParametro.WfConfigData = new WorkflowConfigData(list.id_dt_configuracao_workflow);
                    wfParametro.WfNivel = new WorkflowNivel(list.id_nivel_workflow);
                    wfParametro.ParametroDia = list.parametro_dia;
                    wfParametro.WfConfig = new WorkflowConfig(list.id_configuracao_workflow);

                    listWfParametro.Add(wfParametro);
                }

                return listWfParametro;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<WorkflowConfigParametro> SelectPor(int idWfConfigData, string tipo)
        {
            try
            {
                List<WorkflowConfigParametro> listWfParametro = new List<WorkflowConfigParametro>();

                var consulta = from cwp in _context.tab_configuracao_parametro_workflow
                               where ((tipo == "Simples") ? cwp.tab_configuracao_workflow.id_configuracao_workflow == idWfConfigData : cwp.tab_configuracao_data_workflow.id_dt_configuracao_workflow == idWfConfigData)
                               select new
                               {
                                   cwp.id_parametro_workflow,
                                   id_dt_configuracao_workflow = cwp.tab_configuracao_data_workflow == null ? 0 : cwp.tab_configuracao_data_workflow.id_dt_configuracao_workflow,
                                   cwp.tab_nivel_workflow.id_nivel_workflow,
                                   cwp.parametro_dia,
                                   id_configuracao_workflow = cwp.tab_configuracao_workflow == null ? 0 : cwp.tab_configuracao_workflow.id_configuracao_workflow
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfigParametro wfParametro = new WorkflowConfigParametro();
                    wfParametro.IdWfConfigParametro = list.id_parametro_workflow;
                    if (tipo == "Composto")
                        wfParametro.WfConfigData = new WorkflowConfigData(list.id_dt_configuracao_workflow);
                    wfParametro.WfNivel = new WorkflowNivel(list.id_nivel_workflow);
                    wfParametro.ParametroDia = list.parametro_dia;
                    if (tipo == "Simples")
                        wfParametro.WfConfig = new WorkflowConfig(list.id_configuracao_workflow);

                    listWfParametro.Add(wfParametro);
                }

                return listWfParametro;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<WorkflowConfigParametro> SelectAlerta(int idWfConfigData, string tipo)
        {
            try
            {
                List<WorkflowConfigParametro> listWfParametro = new List<WorkflowConfigParametro>();

                var consulta = from cwp in _context.tab_configuracao_parametro_workflow
                               where ((tipo == "Simples") ? cwp.tab_configuracao_workflow.id_configuracao_workflow == idWfConfigData : cwp.tab_configuracao_data_workflow.id_dt_configuracao_workflow == idWfConfigData)
                               && (cwp.tab_nivel_workflow.id_nivel_workflow == 10       //10	Alerta1
                                    || cwp.tab_nivel_workflow.id_nivel_workflow == 11   //11	Alerta2
                                    || cwp.tab_nivel_workflow.id_nivel_workflow == 14   //14	Alerta3
                                    || cwp.tab_nivel_workflow.id_nivel_workflow == 15)  //15	Alerta4
                               orderby cwp.tab_nivel_workflow.descricao
                               select new
                               {
                                   cwp.id_parametro_workflow,
                                   id_dt_configuracao_workflow = cwp.tab_configuracao_data_workflow == null ? 0 : cwp.tab_configuracao_data_workflow.id_dt_configuracao_workflow,
                                   cwp.tab_nivel_workflow.id_nivel_workflow,
                                   cwp.parametro_dia,
                                   id_configuracao_workflow = cwp.tab_configuracao_workflow == null ? 0 : cwp.tab_configuracao_workflow.id_configuracao_workflow,
                                   id_tipo_atestado = cwp.tab_tipo_atestado == null ? 0 : cwp.tab_tipo_atestado.id_tipo_atestado
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfigParametro wfParametro = new WorkflowConfigParametro();
                    wfParametro.IdWfConfigParametro = list.id_parametro_workflow;
                    if (tipo == "Composto")
                        wfParametro.WfConfigData = new WorkflowConfigData(list.id_dt_configuracao_workflow);
                    wfParametro.WfNivel = new WorkflowNivel(list.id_nivel_workflow);
                    wfParametro.ParametroDia = list.parametro_dia;
                    if (tipo == "Simples")
                        wfParametro.WfConfig = new WorkflowConfig(list.id_configuracao_workflow);
                    wfParametro.TipoAtestado = new TipoAtestado(list.id_tipo_atestado);

                    listWfParametro.Add(wfParametro);
                }

                return listWfParametro;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<WorkflowConfigParametro> SelectAviso(int idWfConfigData, string tipo)
        {
            try
            {
                List<WorkflowConfigParametro> listWfParametro = new List<WorkflowConfigParametro>();

                var consulta = from cwp in _context.tab_configuracao_parametro_workflow
                               where ((tipo == "Simples") ? cwp.tab_configuracao_workflow.id_configuracao_workflow == idWfConfigData : cwp.tab_configuracao_data_workflow.id_dt_configuracao_workflow == idWfConfigData)
                               && (cwp.tab_nivel_workflow.id_nivel_workflow == 12 //12	Aviso1
                                    || cwp.tab_nivel_workflow.id_nivel_workflow == 13 //13	Aviso2
                                    || cwp.tab_nivel_workflow.id_nivel_workflow == 16 //16	Aviso3
                                    || cwp.tab_nivel_workflow.id_nivel_workflow == 17) //17	Aviso4
                               orderby cwp.tab_nivel_workflow.descricao
                               select new
                               {
                                   cwp.id_parametro_workflow,
                                   id_dt_configuracao_workflow = cwp.tab_configuracao_data_workflow == null ? 0 : cwp.tab_configuracao_data_workflow.id_dt_configuracao_workflow,
                                   cwp.tab_nivel_workflow.id_nivel_workflow,
                                   cwp.parametro_dia,
                                   id_configuracao_workflow = cwp.tab_configuracao_workflow == null ? 0 : cwp.tab_configuracao_workflow.id_configuracao_workflow
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfigParametro wfParametro = new WorkflowConfigParametro();
                    wfParametro.IdWfConfigParametro = list.id_parametro_workflow;
                    if (tipo == "Composto")
                        wfParametro.WfConfigData = new WorkflowConfigData(list.id_dt_configuracao_workflow);
                    wfParametro.WfNivel = new WorkflowNivel(list.id_nivel_workflow);
                    wfParametro.ParametroDia = list.parametro_dia * -1;

                    if (tipo == "Simples")
                        wfParametro.WfConfig = new WorkflowConfig(list.id_configuracao_workflow);

                    listWfParametro.Add(wfParametro);
                }

                return listWfParametro;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try
            {
                if (this.IdWfConfigParametro == 0)
                {
                    if (this._tipoAtestado != null)
                    {
                        SalvarAtestadosConfigParametro();
                    }
                    else
                    {
                        tab_configuracao_parametro_workflow tabParametro = new tab_configuracao_parametro_workflow();

                        if (WfConfigData != null)
                            tabParametro.tab_configuracao_data_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_data_workflow", "id_dt_configuracao_workflow", this.WfConfigData.IdWfConfigData);
                        if (WfConfig != null)
                            tabParametro.tab_configuracao_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_workflow", "id_configuracao_workflow", this.WfConfig.IdWfConfig);

                        tabParametro.tab_nivel_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_nivel_workflow", "id_nivel_workflow", this.WfNivel.IdWfNivel);
                        tabParametro.parametro_dia = this.ParametroDia;

                        _context.AddTotab_configuracao_parametro_workflow(tabParametro);
                        _context.SaveChanges();

                        CarregaId();

                        SalvarGrupoEmail();
                    }
                }
                else
                {
                    tab_configuracao_parametro_workflow tabParametro = (from cpwf in _context.tab_configuracao_parametro_workflow
                                                                        where cpwf.id_parametro_workflow == this.IdWfConfigParametro
                                                                        select cpwf).First();

                    if (WfConfigData != null)
                        tabParametro.tab_configuracao_data_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_data_workflow", "id_dt_configuracao_workflow", this.WfConfigData.IdWfConfigData);
                    if (WfConfig != null)
                        tabParametro.tab_configuracao_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_workflow", "id_configuracao_workflow", this.WfConfig.IdWfConfig);

                    tabParametro.tab_nivel_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_nivel_workflow", "id_nivel_workflow", this.WfNivel.IdWfNivel);
                    tabParametro.parametro_dia = this.ParametroDia;

                    _context.SaveChanges();

                    SalvarGrupoEmail();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void SalvarGrupoEmail()
        {
            try
            {
                if (this.IdWfConfigParametro != 0)
                {
                    foreach (GrupoEmail item in this.GrupoEmail)
                    {
                        int idRelacao = RetornaIdRelacaoGrupoEmail(this.IdWfConfigParametro, item.IdGrupoEmail);

                        if (idRelacao == 0)
                        {
                            tab_configuracao_parametro_workflow_grupo_email tabRel = new tab_configuracao_parametro_workflow_grupo_email();
                            tabRel.tab_configuracao_parametro_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_parametro_workflow", "id_parametro_workflow", this.IdWfConfigParametro);
                            tabRel.tab_grupo_emailReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_grupo_email", "Id_grupo_email", item.IdGrupoEmail);

                            _context.AddTotab_configuracao_parametro_workflow_grupo_email(tabRel);
                            _context.SaveChanges();
                        }
                    }

                    RemoverRelGruposEmails();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void RemoverRelGruposEmails()
        {
            try
            {
                if (this.IdWfConfigParametro != 0)
                {
                    var consulta = from rel in _context.tab_configuracao_parametro_workflow_grupo_email
                                   where rel.tab_configuracao_parametro_workflow.id_parametro_workflow == this.IdWfConfigParametro
                                   select new 
                                   {
                                       rel.id_configuracao_parametro_grupo_email,
                                       rel.tab_grupo_email.Id_grupo_email,
                                       rel.tab_configuracao_parametro_workflow.id_parametro_workflow
                                   };

                    var listConsulta = consulta.ToList();

                    foreach (var list in listConsulta)
                    {
                        bool isRemove = true;

                        if (this.GrupoEmail != null)
                        {
                            foreach (GrupoEmail item in this.GrupoEmail)
                            {
                                if (list.Id_grupo_email == item.IdGrupoEmail)
                                {
                                    isRemove = false;
                                    break;
                                }
                            }
                        }

                        if (isRemove)
                        {
                            tab_configuracao_parametro_workflow_grupo_email tabGrupoEmail = (from teste in _context.tab_configuracao_parametro_workflow_grupo_email
                                                                                              where teste.id_configuracao_parametro_grupo_email == list.id_configuracao_parametro_grupo_email
                                                                                              select teste).First();

                            //_context.AddTotab_configuracao_paramentro_workflow_grupo_email(tabGrupoEmail);
                            //_context.AcceptAllChanges();

                            _context.DeleteObject(tabGrupoEmail);
                            _context.SaveChanges();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void Excluir()
        {
            try
            {
                if (this.IdWfConfigParametro != 0)
                {
                    var consulta = from cwp in _context.tab_configuracao_parametro_workflow
                                   where cwp.id_parametro_workflow == this.IdWfConfigParametro
                                   select new
                                   {
                                       cwp.id_parametro_workflow,
                                       id_dt_configuracao_workflow = cwp.tab_configuracao_data_workflow == null ? 0 : cwp.tab_configuracao_data_workflow.id_dt_configuracao_workflow,
                                       cwp.tab_nivel_workflow.id_nivel_workflow,
                                       cwp.parametro_dia,
                                       id_configuracao_workflow = cwp.tab_configuracao_workflow == null ? 0 : cwp.tab_configuracao_workflow.id_configuracao_workflow
                                   };

                    var listConsulta = consulta.ToList();

                    foreach (var list in listConsulta)
                    {
                        this.GrupoEmail = null;
                        RemoverRelGruposEmails();

                        tab_configuracao_parametro_workflow tabParametro = (from cpwf in _context.tab_configuracao_parametro_workflow
                                                                            where cpwf.id_parametro_workflow == this.IdWfConfigParametro
                                                                            select cpwf).First();

                        _context.DeleteObject(tabParametro);
                        _context.SaveChanges();

                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion

    }
}
